package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
	"time"
)

type User struct {
	ID int  //ID默认主键(Id?),也可以自己设定`gorm:"primary_key"`
	Name string `gorm:"not null;type:varchar(25)"`
	//sql.NullInt32 实现了 Scanner/Valuer 接口,避免在查询时因为空值没有查询。指针也可以
	Age sql.NullInt32
	// 或 *int
	//Age *int
	//重设列名
	//Name string  `gorm:"column:beast_id"` 将列名设为user_name
}

// 表名默认为结构体名小写复数形式，可修改。设置User的表名为`profiles`
//func (User) TableName() string {
//	return "profiles"
//}

//var Db *gorm.DB


func main() {
	//自定义全局表名，添加前缀，如tb_users,项目中可是使用项目名
	//gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string  {
	//	return "tb_" + defaultTableName
	//}

	db, err := gorm.Open("mysql", "root:mysql@(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {

	}
	defer db.Close()
	if err != nil {
		fmt.Println(err)
	}
	defer db.Close()

	db.DB().SetMaxIdleConns(10)  //设置最大空闲树
	db.DB().SetMaxOpenConns(100)  //设置最大连接数
	db.DB().SetConnMaxLifetime(5*time.Second)

	// 全局禁用表名复数
	//db.SingularTable(true) // 如果设置为true,`User`的默认表名为`user`,使用`TableName`设置的表名不受影响

	//自动迁移数据库表
	db.AutoMigrate(&User{})
	//db.AutoMigrate(&User{}, &Profile{})
	//db.NewRecord(user) // => 判断是否有主键，主键为空返回`true`

	// 创建表时添加表后缀
	//db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})

	// 检查模型`User`表是否存在
	//db.HasTable(&User{})

	// 检查表`users`是否存在
	//db.HasTable("users")

	//表的列操作
	// 修改列：修改模型`User`的description列的数据类型为`text`
	//db.Model(&User{}).ModifyColumn("description", "text")

	// 删除列：删除模型`User`的description列
	//db.Model(&User{}).DropColumn("description")

	// 添加外键
	// 参数分别为：外键字段，外键表(字段)， ONDELETE， ONUPDATE
	//db.Model(&User{}).AddForeignKey("city_id", "cities(id)", "RESTRICT", "RESTRICT")


	//索引
	// 为`name`列添加索引`idx_user_name`
	//db.Model(&User{}).AddIndex("idx_user_name", "name")

	// 为`name`, `age`列添加索引`idx_user_name_age`
	//db.Model(&User{}).AddIndex("idx_user_name_age", "name", "age")

	// 删除索引
	//db.Model(&User{}).RemoveIndex("idx_user_name")

	//user:=User{Name: "小明", Age: sql.NullInt32{18, true}}
	//record := db.NewRecord(user)
	//fmt.Println(record)
	//db.Create(&user)
	var users User
	db.First(&users)
	fmt.Println(users)
}


